// #define KEY_ID "id"
// Json::Value v;
// v["id"]=xxx; ×
// v[KEY_ID]=xxx; √

#pragma once
/*
    定义项目中用到的字段的宏 / 枚举定义
*/
#include <string>
#include <unordered_map>
using std::string;

namespace tmh_rpc
{
// body 正文部分的字段 宏定义
//  请求消息包含的字段
//  RpcRequest
#define KEY_METHOD "method"
#define KEY_PARAMETER "parameters"

// TopicRequest
#define KEY_TOPIC_KEY "topic_key"
#define KEY_TOPIC_MSG "topic_msg"
#define KEY_OPTYPE "optype"

// ServiceRequest
#define KEY_HOST "host"
// ip和port属于host中的子元素
#define KEY_HOST_IP "ip"
#define KEY_HOST_PORT "port"

// 响应消息包含的字段
// RpcResponse && TopicResponse && ServiceResponse
#define KEY_RCODE "rcode"

// RpcResponse
#define KEY_RESULT "result"

    // 消息类型的定义
    enum class MType
    {
        // Rpc请求 & 响应
        REQ_RPC = 0,
        RSP_RPC,

        // 分布/订阅 请求 & 响应
        REQ_TOPIC,
        RSP_TOPIC,

        // 服务注册/发现 请求 & 响应
        REQ_SERVICE,
        RSP_SERVICE
    };

    // 响应码类型的枚举定义
    enum class RCode
    {
        // 成功处理
        RCODE_OK = 0,
        // 解析失败
        RCODE_PARSE_FAILED,
        // 消息类型错误
        RCODE_ERROR_MSGTYPE,
        // 消息中字段缺失或错误导致无效消息
        RCODE_INVALID_MSG,
        // 连接断开
        RCODE_DISCONNECTED,
        // 无效的Rpc调用参数
        RCODE_INVALID_PARAMS,
        // Rpc服务不存在
        RCODE_NOT_FOUND_SERVICE,
        // 无效的Topic操作类型
        RCODE_INVALID_OPTYPE,
        // 主题不存在
        RCODE_NOT_FOUND_TOPIC,
        // 内部错误
        RCODE_INTERNAL_ERROR
    };

    // 对上面的返回响应码进行封装，以便于找到出错原因
    static string errReason(RCode code)
    {
        static std::unordered_map<RCode, string> err_map = {
            {RCode::RCODE_OK, "成功处理!"},
            {RCode::RCODE_PARSE_FAILED, "消息解析失败!"},
            {RCode::RCODE_ERROR_MSGTYPE, "消息类型错误!"},
            {RCode::RCODE_INVALID_MSG, "无效消息!"},
            {RCode::RCODE_DISCONNECTED, "连接已断开!"},
            {RCode::RCODE_INVALID_PARAMS, "无效的Rpc参数!"},
            {RCode::RCODE_NOT_FOUND_SERVICE, "没有找到对应的服务!"},
            {RCode::RCODE_INVALID_OPTYPE, "无效的操作类型!"},
            {RCode::RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题!"},
            {RCode::RCODE_INTERNAL_ERROR, "内部错误!"},
        };
        auto it = err_map.find(code);
        if (it == err_map.end())
        {
            return "未知错误!";
        }
        return it->second;
    }
    // end 封装完毕

    // RPC请求类型的枚举定义
    enum class RType
    {
        REQ_ASYNC = 0, // 异步请求
        REQ_CALLBACK   // 回调请求
    };

    // 主题操作类型定义 "Topic Operate Type"
    enum class TopicOptype
    {
        TOPIC_CREATE = 0, // 主题创建
        TOPIC_REMOVE,     // 主题删除
        TOPIC_SUBSCRIBE,  // 主题订阅
        TOPIC_CANCEL,     // 取消订阅
        TOPIC_PUBLISH     // 主题消息发布
    };

    // 服务操作类型定义 "Service Operate Type"
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0, // 服务注册
        SERVICE_DISCOVERY,    // 服务发现
        SERVICE_ONLINE,       // 服务上线
        SERVICE_OFFLINE,      // 服务下线
        SERVICE_UNKNOW        // 未知服务
    };
}